package es.fonso.codigo.descargas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;

import es.fonso.codigo.Configuracion;
import es.fonso.codigo.paginas.PaginaGeneral;
import es.fonso.codigo.servidores.ServidorGeneral;
import es.fonso.visual.MainWindow;

public abstract class DescargaGeneral extends PaginaGeneral {
	
	private String nombre;
	private String urlTorrent;
	private String tamano;
	private String calidad;
	private String fecha;
	private String categoria;
	
	private HashMap<Integer,ArrayList<ServidorGeneral>> listaServidores;

	public DescargaGeneral(){
		listaServidores=new HashMap<>();
	}
	
	public DescargaGeneral(String url) {

	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getUrlTorrent() {
		return urlTorrent;
	}

	public void setUrlTorrent(String urlTorrent) {
		this.urlTorrent = urlTorrent;
	}
	
	public String getTamano() {
		return tamano;
	}

	public void setTamano(String tamano) {
		this.tamano = tamano;
	}
	
	public String getFecha(){
		return fecha;
	}
	
	public void setFecha(String fecha){
		this.fecha = fecha;
	}

	public String getCalidad() {
		return calidad;
	}

	public void setCalidad(String calidad) {
		this.calidad = calidad;
	}
	

	public String getCategoria() {
		return categoria;
	}

	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}		
	
	
	public void setServidor(ServidorGeneral s){

		listaServidores.get(s.getClave()).add(s);
	}

	public ArrayList<String> getUrlServidor(Integer i){
		ArrayList<String> resultado = new ArrayList<String>();
		for (ServidorGeneral s :getServidor(i)){
			resultado.add(s.getUrl());
		}
		return resultado;
	}
	
	public void putServidor(Integer i, ServidorGeneral s){
		if (listaServidores.containsKey(i)){
			this.listaServidores.get(i).add(s);
		}
		else{
			ArrayList<ServidorGeneral> nuevo =  new ArrayList<ServidorGeneral>();
			nuevo.add(s);
			this.listaServidores.put(i,nuevo);
		}
	}
	
	public void putServidor(Integer i, ArrayList<ServidorGeneral> lista){
	
			this.listaServidores.put(i,lista);
	
	}
	
	public ArrayList<ServidorGeneral> getServidor(Integer i){
		return this.listaServidores.get(i);
	}
	
	public Collection<ServidorGeneral> getAllServidores(){
		HashSet<ServidorGeneral> resultado = new HashSet();
		for (ArrayList<ServidorGeneral> sg : this.listaServidores.values())
			resultado.add(sg.get(0));
		return resultado;
	}

	
	/**
	 * @return concatenacion de las abreviaturas de los servidores que tiene esta descarga
	 */
	public String getServidores(){
		StringBuffer s = new StringBuffer();
		for (ArrayList<ServidorGeneral> sg : this.listaServidores.values()){
			s.append(sg.get(0).getAbreviatura());
		}
		return s.toString();
	}
	
	public void descargarTorrent() {
		try {
			MainWindow.log("Descargando torrent: " + nombre);
			URL url = new URL(urlTorrent);
			URLConnection urlCon = url.openConnection();
			urlCon.setRequestProperty(
					"User-Agent",
					USER_AGENT);

			// acceso al contenido web
			InputStream is = urlCon.getInputStream();

			String extension = ".torrent";

			// Fichero en el que queremos guardar el contenido
			
//			File dir = new File("torrents\\");
//			dir.mkdirs();
			
			FileOutputStream fos = new FileOutputStream(Configuracion.get("torrentDir").concat("\\")
					.concat(nombre)
					.concat(extension));
			
			//FileOutputStream fos = new FileOutputStream("c:/1.torrent");

			// buffer para ir leyendo.
			byte[] array = new byte[10000];

			// Primera lectura y bucle hasta el final
			int leido = is.read(array);
			while (leido > 0) {
				fos.write(array, 0, leido);
				leido = is.read(array);
			}

			// Cierre de conexion y fichero.
			is.close();
			fos.close();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	abstract public void obtenerDatos();

	@Override
	public void cargarPaginacion() {}

	@Override
	public void cargarCategorias() {}

	@Override
	public String toString() {return null;}

	@Override
	public void obtenerListadoDescargas() {}
	
	
	@Override
	public String getLinkBusqueda() {return null;}

}
